import re

from flask import request, current_app, redirect, url_for, g

from application import app
from common.libs.UserSerivice import UserService
from web.models.user import User
from common.libs.logservice import LogService


def check_login():
    """判断用户是否登录"""
    cookie = request.cookies
    auth_key = app.config["AUTH_COOKIE_NAME"]
    # print('auth_key', auth_key)
    # 定义auth_cookie身份验证cookie对象，如果密钥
    # auth_cookie: bdc556da52d17c3f664aa50c1d1c77cc#1
    auth_cookie = cookie[auth_key] if auth_key in cookie else ""
    # print(auth_cookie)
    if auth_cookie is None:
        return False  # False表示没有登录
    # 防止恶意篡改cookie欺骗服务器，规则隐藏在源码
    # 分离#，如果不为2个参数bdc556da52d17c3f664aa50c1d1c77cc和1则报错
    auth_info = auth_cookie.split("#")
    if len(auth_info) != 2:
        return False
    try:
        # 查数据库id为1的用户信息赋予给user_info对象
        user_info = User.query.filter_by(uid=auth_info[1]).first()
    except:
        return False
    if user_info is None:
        return False
    # 判断cookie
    authcode = UserService.genAuthCode(user_info)
    if auth_info[0] != authcode:
        return False
    # print('user_info', user_info)
    return user_info


# before_request注册一个在处理请求之前运行的函数
@app.before_request
def before_request():
    """拦截器"""
    # 导入日志信息处理工具，登录以后会执行拦截器，执行拦截器的时候会自动执行日志信息写入
    LogService.addAccesslog()
    path = request.path
    user_info = check_login()  # 登录校验
    # 在拦截器中把用户信息放入全局g对象中
    g.current_user = user_info
    # 载入设置里需要忽略的urls
    ignore_urls = current_app.config["IGNORE_URLS"]
    ignore_check_login_urls = current_app.config["IGNORE_CHECK_LOGIN_URLS"]
    ignore_merge = ignore_urls + ignore_check_login_urls  # 所有的url
    print('过滤的路由：', ignore_merge)
    pattern = re.compile("|".join(ignore_merge))
    if pattern.match(path):
        return None #return None不做拦截
    if not user_info: #没有登录
        return redirect(url_for('user_page.login'))
    # 以上规则通过则不做拦截返回None
    return None